跳到主要内容

Git Hooks 挂载脚本

因为 VSCode 抽风,把我项目直接初始化了,所以所有写好的钩子都没有了.... 这里记录一下平时用到的脚本

钩子的名字和模板钩子的名字是一致的

pre-commit 提交之前
post-commit 提交之后
pre-rebase 变基之前
post-rewrite 替换提交记录之后
pre-push 推之前

常用的钩子

客户端 hook

  • git commit 相关 hook
  • pre-commit:提交前执行,可以使用 git commit --no-verify 命令跳过该 hook。
  • prepare-commit-msg:在启动提交信息编辑器之前执行,用于定制提交时出现信息。可以结合提交模板使用,动态地插入信息。
  • commit-msg:
  • post-commit:提交过程完成后运行的 hook,不接收任何参数。

git am 相关 hook

git am 用于应用(apply)来自邮箱(mailbox)的 patch,am 正是 “apply mailbox” 的缩写。am 流程会检测 3 个 hook:

  • pre-applypatch:运行于应用补丁后、产生 commit 前。因此更合理的命名可能应该是 post-applypatch-pre-commit。
  • applypatch-msg:它接收单个参数:包含请求合并信息的临时文件的名字。 如果脚本返回非零值,Git 将放弃该补丁。 你可以用该脚本来确保提交信息符合格式,或直接用脚本修正格式错误。
  • post-applypatch:应用补丁并产生提交之后。

其它客户端 hook

  • pre-rebase:运行于 git rebase 之前,官方的例子中是用于禁止对已推送的 commit 进行 rebase 操作,这样可以防止于线上的代码库发生冲突。
  • post-checkout:checkout 命令执行完成之后会调用的 hook,通常用于自动调整运行环境。
  • post-merge:运行于合并操作完成之后。
  • pre-auto-gc:在运行 git gc --auto 命令前执行,可以用于提醒即将进行垃圾回收,或者现在是否应当进行垃圾回收。
  • post-rewrite:运行于重写提交信息的命令之前,比如 git commit --amend 之前。
  • pre-push:在 push 操作前执行。

服务器端 hook

  • pre-receive:接收到来自客户端的推送时最先调用的 hook,可以用户阻止“non-fast-forward” 的更新,或者进行文件访问控制。
  • update:类似 pre-receive,不过在同时推送多个分支时 pre-receive 仅仅运行一次,update 会每个分支执行一次。
  • post-update:运行于整个接收服务完成之后。

使用 Powershell 脚本

迁移当前项目的所有文件到另一个目录里面

编写一个 hook,注意第一行一定要写,虽然不是 Linux 运行环境,但是 Git 模拟了它判断运行脚本的机制,这里通过第一行指明是用的啥执行这个脚本

#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -Command "C:\Users\alsritter\OneDrive\MarkDown\.git\hooks\mycommitScript.ps1"

编写一个 powershell 脚本

echo "Start synchronization";
# 如果目标文件已存在,则复制尝试失败。 若要覆盖预先存在的目标,请使用 Force 参数 :
# 还可以复制选定的项。 筛选.md
$source = "C:\Users\alsritter\OneDrive\MarkDown\";
$dest = "D:\MyBlog\source\_posts";
$exclude01 = "noCommit";
$exclude02 = ".git";

# $_:管道的中间结果

Get-ChildItem -Path $source -include *.md -Recurse | ? {-not ($_.Directory.Name -eq $exclude01 -or $_.Directory.Name -eq $exclude02)} | % {Copy-Item $_.fullname $dest -Force};
echo "synchronization OK!";

如果 ps1 脚本有编码问题,需要改成 GBK

Reference

参考资料 自定义 Git - Git 钩子